package net.ankao.org.easylock.core;

import java.util.concurrent.TimeUnit;

/**
 * <p>
 * EasyLockTemplate
 * </p>
 *
 * @author ankao.net
 * @since 2022/3/28
 */
public interface EasyLockTemplate {

    long DEFAULT_WAIT_TIME = 30;
    long DEFAULT_TIMEOUT = 5;
    TimeUnit DEFAULT_TIME_UNIT = TimeUnit.SECONDS;


    /**
     * 使用分布式锁，使用锁默认超时时间。
     * @param callback 回调
     * @param fairLock 是否使用公平锁
     * @param <T> 执行结果
     * @return 执行结果
     * @throws Throwable 异常
     */
    <T> T lock(EasyLockCallback<T> callback, boolean fairLock) throws Throwable;


    /**
     * 使用分布式锁。自定义锁的超时时间
     *
     * @param callback 回调
     * @param leaseTime 锁超时时间。超时后自动释放锁。
     * @param timeUnit 单位
     * @param fairLock  是否使用公平锁
     * @param <T> 泛型
     * @return T
     * @throws Throwable 异常
     */
    <T> T lock(EasyLockCallback<T> callback, long leaseTime, TimeUnit timeUnit, boolean fairLock) throws Throwable;

    /**
     * 尝试分布式锁，使用锁默认等待时间、超时时间。
     *
     * @param callback 回调
     * @param fairLock 是否使用公平锁
     * @param <T> 泛型
     * @return T
     * @throws Throwable 异常
     */
    <T> T tryLock(EasyLockCallback<T> callback, boolean fairLock) throws Throwable;

    /**
     * 尝试分布式锁，自定义等待时间、超时时间。
     *
     * @param callback 回调
     * @param waitTime  获取锁最长等待时间
     * @param leaseTime 锁超时时间。超时后自动释放锁。
     * @param timeUnit 时间单位
     * @param fairLock  是否使用公平锁
     * @param <T> 泛型
     * @return 回调执行结果
     * @throws Throwable 异常
     */
    <T> T tryLock(EasyLockCallback<T> callback, long waitTime, long leaseTime, TimeUnit timeUnit, boolean fairLock) throws Throwable;

}
